/**
 * 给定X个a，Y个b，对每一个i属于[1, X+Y]，
 * 问构成i个连续段的字符串的方案一共有多少
 * 考虑到段，且只有两种字母，因此必须要交叉放
 * 假设i是偶数，则必然各占i/2段。
 * 即要把X个a分配到i/2个空位，这是一个球同盒异不空的模型
 * 用隔板法很容易知道答案是C(n-1,m-1)，n球同m盒异不空的方案数
 * 然后再交换一下顺序，即乘2
 * 假设i是奇数，一样可以求出答案
 */
#include <bits/stdc++.h>
using namespace std;

using llt = long long;
using vi = vector<int>;

llt const MOD = 1E9 + 7;

int X, Y;

vector<vector<llt>> C(2001, vector<llt>(2001, 0LL));

void init(){
    C[0][0] = 1LL;
    for(int i=1;i<2001;++i){
        C[i][0] = C[i][i] = 1;
        for(int j=1;j<i;++j){
            C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % MOD;
        }
    }
    return;
}

llt proc(int n, int total){
    assert(total);
    if(n == 0) return 0;
    if(n > total) return 0;
    return C[total - 1][n - 1];
}

llt procOu(int n){
    n >>= 1;
    auto ans = proc(n, X) * proc(n, Y) % MOD;
    ans = (ans + ans) % MOD;
    return ans;
}

llt procJi(int n){
    int t = n / 2;
    int o = n - t;
    auto ans = proc(t, X) * proc(o, Y) % MOD;
    ans = (ans + proc(t, Y) * proc(o, X) % MOD) % MOD;
    return ans;
}

void proc(){
    for(int i=1;i<=X+Y;++i){
        if(1 == i){
            if(X){
                if(Y) cout << "0\n";
                else cout << "1\n";
            }else{
                if(Y) cout << "1\n";
                else assert(0);
            }
        }else if(i & 1){
            cout << procJi(i) << "\n";
        }else{
            cout << procOu(i) << "\n";
        }
    }
    return;
}


int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);
    init();
    int nofkase = 1;
    // cin >> nofkase;
    while(nofkase--){
        cin >> X >> Y;
		proc();
    }
    return 0;
}